package com.mig.coins.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class ApunteExtended extends Apunte {
	private int nMonedas = 0;
	private String descrPedido = null;
	private String nombreSocio = null;

	private final static String GET_SQL = "SELECT `apuntes`.`id`, `apuntes`.`propietario`, `apuntes`.`descripcion`, " +
	"  `apuntes`.`fecha`, `apuntes`.`importe`, `apuntes`.`pedido`, `apuntes`.`prevision`, " +
	"  `apuntes`.`observaciones`, " +
	"  (SELECT COUNT(*) FROM `colecciones` c WHERE (c.`apunte` = `apuntes`.`id`)) nMonedas, " +
	"  `pedidos`.`descripcion`, `socios`.`nombre` " +
	"FROM `apuntes` LEFT JOIN `pedidos` ON `apuntes`.`pedido`= `pedidos`.`id`, `socios` " +
	"WHERE (`socios`.`id` = `apuntes`.`propietario`) ";

	public static ApunteExtended readApunteExtended(Connection conn, Long _id) throws SQLException {
		ApunteExtended _apunte = new ApunteExtended(); 
		PreparedStatement stmt=null;
		ResultSet rs = null;

		stmt=conn.prepareStatement(GET_SQL + "AND `apuntes`.id=?");
		stmt.setLong(1, _id.longValue());
		rs = stmt.executeQuery();
		if (rs.next()) 
			_apunte.loadApunteExtendedFromResultSet(rs);
		else 
			_apunte = null;

		if (rs != null) rs.close();
		if (stmt != null) stmt.close(); 

		return _apunte;
	}


	public static ArrayList<ApunteExtended> searchApunteExtended(Connection conn, String where, String sort) throws SQLException {
		String query = GET_SQL;
		if ((where != null) && (where.trim().length()>0)) {
			query +="AND " + where + " ";
		}
		if ((sort != null) && (sort.trim().length()>0)) {
			query +="ORDER BY " + sort + " ";
		}
		// Creamos el Statement y el ResultSet.
		Statement stm = conn.createStatement();
		ResultSet rs = stm.executeQuery(query);
		
		// Procesamos el ResultSet.
		ArrayList<ApunteExtended> lApuntes = null;
		while (rs.next()) {
			ApunteExtended _apunte = new ApunteExtended();
			_apunte.loadApunteExtendedFromResultSet(rs);
			if (null == lApuntes)
				lApuntes = new ArrayList<ApunteExtended>();
			lApuntes.add(_apunte);
		}
		rs.close();
		stm.close();
		return lApuntes;
	}


	public void loadApunteExtendedFromResultSet(ResultSet rs) throws SQLException {
		this.loadApunteFromResultSet(rs);
		
		if (null != rs.getString(9))
			this.nMonedas = rs.getInt(9);
		else
			this.nMonedas = 0;
		this.descrPedido = rs.getString(10);
		this.nombreSocio = rs.getString(11);
	}

	public int getNMonedas() {
		return nMonedas;
	}

	public String getDescrPedido() {
		return descrPedido;
	}


	public String getNombreSocio() {
		return nombreSocio;
	}
}
